<template>
  <!-- 最外层的容器 -->
  <view class="my-checkout-container">
    <!-- 全选区域 -->
    <label class="radio" @click="checkAllHandler">
      <radio color="#C00000" :checked="isCheckedAll" />
      <text>全选</text>
    </label>

    <!-- 合计区域 -->
    <view class="amount-box">
      合计:<text class="amount">￥{{ checkedAmount }}</text>
    </view>

    <!-- 结算按钮 -->
    <view class="btn-checkout" @click="checkout">结算({{ checkedTotal }})</view>
  </view>
</template>

<script>
import { mapGetters, mapState } from 'vuex'
export default {
  data() {
    return {
      // 倒计时的时间
      seconds: 3,
      // 定时器id
      timerId: null,
    }
  },
  computed: {
    ...mapGetters('cart', ['checkedTotal', 'total', 'checkedAmount']),
    ...mapGetters('user', ['fullAddress']),
    ...mapState('user', ['token']),

    isCheckedAll() {
      // 如果选中的商品总数和商品总数相同 => 所有商品选中
      return this.checkedTotal === this.total
    },
  },
  methods: {
    checkAllHandler() {
      // 点击了全选区域, 提交mutation 更新所有商品的状态
      this.$store.commit('cart/updateAllState', !this.isCheckedAll)
    },
    checkout() {
      // 1.是否选中商品
      if (this.checkedTotal === 0) {
        // 没有需要结算的商品
        return this.$msg('请先选择需要结算的商品')
      }
      // 2.有没有收货地址
      if (!this.fullAddress) {
        // 没有收货地址
        return this.$msg('请选择收货地址')
      }
      // 3.是否登录
      if (!this.token) {
        // 没有登录 => 帮用户跳转到登录页(倒计时)
        // return this.$msg('请先登录')
        this.delayNavigate()
        return
      }

      console.log('可以结算了')
      // 结算逻辑非常复杂且严格 => 封装
      this.payOrder()
    },
    async payOrder() {
      // 完成支付

      // 1.创建订单
      const { meta, message } = await this.$http.post('/my/orders/create', {
        // 为了前端开发期间测试支付 自己决定支付多少金额
        order_price: 0.01,
        // 收获地址
        consignee_addr: this.fullAddress,
        // 选中的商品信息(goods_id goods_price goods_number)
        goods: this.$store.state.cart.cartItems
          .filter((item) => item.goods_state)
          .map((item2) => {
            return {
              goods_id: item2.goods_id,
              goods_price: item2.goods_price,
              goods_number: item2.goods_count,
            }
          }),
      })

      if (meta.status !== 200) return this.$msg('创建订单失败')

      console.log('订单编号是: ', message.order_number)

      // 2.获取支付参数
      const { meta: meta2, message: message2 } = await this.$http.post(
        '/my/orders/req_unifiedorder',
        {
          order_number: message.order_number,
        }
      )

      if (meta2.status !== 200) return this.$msg('订单预支付失败')

      console.log('订单支付参数是: ', message2.pay)

      // 3.真正支付: 调用原生方法 requestPayment({})
      const [err, res] = await uni.requestPayment(message2.pay)

      if (err) {
        // 有错误
        return this.$msg('支付订单失败')
      }

      // console.log('支付订单成功');

      // 4. 真正发请求 让服务器验证这个订单的支付状态
      const { meta: meta3, message: message3 } = await this.$http.post(
        '/my/orders/chkOrder',
        {
          // 订单编号
          order_number: message.order_number,
        }
      )

      if (meta3.status !== 200) return this.$msg('支付订单失败')

      // console.log(message3)
      this.$msg('支付订单成功')
    },
    delayNavigate() {
      // 延迟跳转 倒计时跳转

      // 重置秒数
      this.seconds = 3

      this.$msg('请登录后再结算！' + this.seconds + ' 秒后自动跳转到登录页')

      this.timerId = setInterval(() => {
        this.seconds--

        if (this.seconds <= 0) {
          // 到时间了 => ??? 跳转+关闭定时器+告诉代码将来回到哪个页面(cart)
          clearInterval(this.timerId)

          // 提交mutation  更新回跳信息
          this.$store.commit('user/setRedirectInfo', {
            url: '/pages/cart/cart',
            type: 'tabbar',
          })

          uni.switchTab({ url: '/pages/my/my' })
        } else {
          // 没到时间
          this.$msg('请登录后再结算！' + this.seconds + ' 秒后自动跳转到登录页')
        }
      }, 1000)
    },
  },
}
</script>

<style lang="scss">
.my-checkout-container {
  position: fixed;
  bottom: 0;
  left: 0;
  z-index: 999;
  width: 100%;
  height: 100rpx;
  background-color: white;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-left: 10rpx;
  font-size: 28rpx;

  .radio {
    display: flex;
    align-items: center;
  }

  .amount {
    color: #c00000;
  }

  .btn-checkout {
    height: 100rpx;
    min-width: 200rpx;
    background-color: #c00000;
    color: white;
    line-height: 100rpx;
    text-align: center;
    padding: 0 20rpx;
  }
}
</style>
